import qs from 'qs'
import Taro from '@tarojs/taro'
import lodash from "@/utils/lodash"
import accounting from '../assets/js/accounting.min'
import { APP_DESIGN_WIDTH, APP_SYSTEM_INFO } from "@/config/config"
import { getGlobalData } from "@/utils/storage"
import {AUTH_TOKEN} from "@/config/storage";
import {toWeChatLogin} from "@/api/oauthApi";

/**
 * 获取当前页
 */
export function getCurrentPages():any {
  return lodash.last(Taro.getCurrentPages())
}

/**
 * 获取当前页路由参数
 */
export function getCurrentRouter():any {
  return getCurrentPages()['$router']
}

/**
 * 获取路由参数
 * @param that
 */
export function getRouterParams(that):any {
  const params = lodash.cloneDeep(that.$router.params)
  const data = {}
  Object.keys(params).map(name => {
    lodash.set(data, decodeURI(name), params[name])
  })
  return data
}

/**
 * px 像素转 rem
 */
export function pxTransform(size):any {
  const designWidth = 750
  return (
    Math.ceil((((parseInt(size, 10) / 40) * 640) / designWidth) * 10000) /
    10000 +
    'rem'
  )
}

/**
 * 奇数转偶数
 * @origin origin 加数
 * @num num 加数
 */
export function oddToEven(origin:number, num: number = -1) {
  return origin % 2 === 0 ? origin : origin + num
}


/**
 * 奇数转偶数
 * @str 字符串
 * @startLen 前面显示字符长度
 * @endLen 后面显示字符长度
 * @cha 替换字符‘*’
 */
export function getFilter(str, startLen, endLen, cha) {
  let len = str.length - startLen - endLen;
  let replace = "";
  for (let i = 0; i < len; i++) {
    replace += cha;
  }
  return (
    str.substring(0, startLen) + replace + str.substring(str.length - endLen)
  );
}

/**
 * 获取单位
 * @number 数量
 * @nunit  单位
 */
export function getUnit(number, unit) {
  return (number > 10000 ? `${Number((number / 10000).toFixed(1))}万${unit}`: `${number}${unit}`)
}

/**
 * 写入 params 参数
 * @path path 路径
 * @param params 参数对象
 */
export function setUrlParams(path, params:object={}) {
  const str = qs.stringify(params)
  return (`${path}${str ? '?' + str : ''}`)
}

/**
 * 处理小程序跳转超过10层
 * @param url 跳转地址
 * @param params 跳转参数
 * @param isRedirect 重定向
 */
export function jumpUrl (url:string, params:object={}, isRedirect:boolean=false ) {
  const auth = Taro.getStorageSync('AUTH_ORIGINAL')
  if (isWeChat() && !auth) {
    toWeChatLogin()
    return
  }
  //  验证是否登录
  // if (verifyLogin) {
  //   return verifyUserLogin({
  //     fail: function () {
  //       toUserLoginPage()
  //     }
  //   })
  // }

  const pages = Taro.getCurrentPages()
  //  防止小程序中页面栈超过 10 层
  Taro[isRedirect ? 'redirectTo' : ((pages.length >= 7) ? 'redirectTo' : 'navigateTo')]({ url: setUrlParams(url, params) })
}

/**
 *
 * @param url
 * @param m lfit：等比缩放，限制在指定w与h的矩形内的最大图片。mfit：等比缩放，延伸出指定w与h的矩形框外的最小图片。fill：固定宽高，将延伸出指定w与h的矩形框外的最小图片进行居中裁剪。pad：固定宽高，缩略填充。fixed：固定宽高，强制缩略。
 * @param w 指定目标缩略图的宽度。
 * @param h 指定目标缩略图的高度。
 * @param l 指定目标缩略图的最长边。
 * @param s 指定目标缩略图的最短边。
 * @param limit 指定当目标缩略图大于原图时是否处理。值是 1 表示不处理；值是 0 表示处理。
 * @param color 当缩放模式选择为 pad（缩略填充）
 */
// @ts-ignore
export function getThumbnailConfig(url: string, w: number = 0, h: number = 0, m: string = 'lfit', l: number = 0, s: number = 0, limit: number = 1, color: string = '#ffffff') {
  // 设备宽度
  let devWidth = APP_SYSTEM_INFO.windowWidth;
  let imageUrl = url + '?x-oss-process=image/resize,m_' + m;
  // 计算与设计图比例
  let ratio = parseFloat((devWidth / APP_DESIGN_WIDTH).toFixed(2));
  if (w) {
    imageUrl = imageUrl + ',w_' + (w * ratio).toFixed(0);
  }

  if (h) {
    imageUrl = imageUrl + ',h_' + (h * ratio).toFixed(0);
  }
  return imageUrl;
}



/**
 * 金额格式化
 * @param num 数字
 * @param unit 单位
 * @param isReturnInt
 */
export function formatAmount(num: number, unit: string = '', isReturnInt = false) {
  const amount = accounting.formatMoney(num, unit)
  return isReturnInt ? amount.slice(0, amount.length - 3) : amount
}

/**
 * 数字格式化
 * @param number 需要转换的值
 */
export function formatNumber(number:any) {
  return isNaN(number) ? 0 : Number(number)
}

/**
 * 时间格式化
 * @param timestamp 时间戳
 * @param format format
 */
export function formatTime(timestamp: any, format: any = 'YYYY-MM-DD HH:mm:ss') {
  /**
   * 格式化时间
   * @param num
   */
  const formatNum = num => (num <= 9 ? `0${num}` : `${num}`)
  const date = new Date(parseInt(timestamp) * 1000)
  const time = {
    YYYY: date.getFullYear(),
    YY: date.getFullYear().toString().substr(2),
    MM: formatNum(date.getMonth() + 1),
    DD: formatNum(date.getDate()),
    HH: formatNum(date.getHours()),
    mm: formatNum(date.getMinutes()),
    ss: formatNum(date.getSeconds())
  }

  return format.replace(/(YYYY|YY|MM|DD|HH|mm|ss)/g, function (match) {
    return time[match]
  })
}

/**
 * 格式化html
 * @param html html源代码
 */
export function formatHtml (html) {
  if (!html){
    return ''
  }
  let content = html.replace(/<img[^>]*>/gi,function(match){
    let imgStyle = 'width: 100% !important;height: auto;'
    if (match.indexOf('style="') >= 0) {
      return match.replace(new RegExp("(i?)(\<img.*?style=['\"])([^\>]+\>)","gmi"), "$2"+imgStyle+"$3");
    } else {
      return match.replace(new RegExp("(i?)(\<img)(?!(.*?style=['\"](.*)['\"])[^\>]+\>)","gmi"), "$2 style=\""+imgStyle+"\"$3");
    }
  })
  return content
}


/**
 * 判断数据类型
 * @param data 数据
 * @param type 类型
 *
 * [object String] => "hello"
 * [object Number] => 123
 * [object Boolean] => true
 * [object Undefined] => undefined
 * [object Null] => null
 * [object Array] => []
 * [object Object] => {name: "jerry"}
 * [object Function] => function(){}
 * [object Date] => new Date
 * [object RegExp] => /\d/
 * [object Object] => new foo()
 */
export function verifyType (data, type) {
  return Object.prototype.toString.call(data) === `[object ${type}]`
}


/**
 * 地图导航
 * @param lat 纬度
 * @param lng 经度
 * @param name 名称
 * @param address 地址
 */
export function openLocation(lat: number, lng: number, name: '', address : '') {
  lat = Number(lat)
  lng = Number(lng)
  Taro.openLocation({
    latitude: lat,
    longitude: lng,
    name: name,
    address: address
  })
}

/**
 * 拨打电话
 * @param phone 手机号
 */
export function makePhoneCall(phone: string) {
  return Taro.makePhoneCall({
    phoneNumber: phone,
  })
}


/**
 * 复制文本
 * @param text 文本
 */
export function copyText (text) {
  Taro.setClipboardData({
    data: text,
    success: function () {
      Taro.getClipboardData({
        success: function () {
          Taro.showToast({title: '复制成功'})
        }
      })
    }
  })
}

/**
 * 获取首张图片
 * @param images
 */
export function headImg (images=[]) {
  const image:any = lodash.head(images)
  return image
}

// /**
//  * 读取区域信息
//  */
// export function updateTabBarBadge(index, num) {
//   const text = num + ''
//   if (num > 0) {
//     Taro.setTabBarBadge({ index, text })
//   } else {
//     Taro.removeTabBarBadge({ index })
//   }
// }

/**
 * 自动补零
 * @param num 传入的数字
 * @param n 需要的字符长度
 * @constructor
 */
export function PrefixZero(num, n) {
  return (Array(n).join('0') + num).slice(-n)
}

/**
 * 计算剩余时间
 * @param s 秒
 */
export function calcSurplusTime(s=0) {
  let [ day, hours, minutes, seconds ] = [ 0, 0, 0, 0 ]
  if (s > 0) {
    day = Math.floor(s/86400)
    hours = Math.floor(s/3600) - day*24
    minutes = Math.floor(s/60) - day*24*60 - hours*60
    seconds = Math.floor(s) - day*86400 - hours*3600 - minutes*60
  }
  return { day, hours, minutes, seconds }
}

/**
 * 显示空数据状态
 * @param list 列表长度
 * @param status
 */
export function showEmpty(list:any=[], status:string) {
  return (!list.length && status == 'noMore')
}



/* ------------------------------------------------------- 获取商品状态 ------------------------------------------------------- */
/**
 * 获取商品状态
 * @param info 商品信息
 * @param scene 场景id
 */
export function getGoodsStatus(info:any, scene?:number) {
  switch(scene) {
    //  首页秒杀
    case 1:
      //  活动倒计时秒数
      info.seconds = info.status ? info.endSeconds : info.startSeconds

      //  状态名称
      const names = {
        '-1': '已结束',
        '0': '距开始',
        '1': '距结束',
      }
      info.statusName = names[info.status]

      //  禁用购买
      info.disabled = info.status < 1
      break
    default:
      //  策略类型
      info.strategyType = info.strategy && info.strategy.strategyType

      if (info.strategy) {
        //  活动倒计时秒数
        const { strategy } = info
        info.seconds = strategy.status ? strategy.endSeconds : strategy.startSeconds

        //  活动状态[ -1 => 已结束, 0 => 未开始, 1 => 正常 ]
        info.status = strategy.status

        //  状态名称
        const names = {
          '-1': '已结束',
          '0': '未开始',
        }
        info.statusName = names[strategy.status]

        //  禁用购买
        info.disabled = strategy.status < 1
      }
  }

  return info
}

/* ------------------------------------------------------- 获取商品状态 ------------------------------------------------------- */



/* ------------------------------------------------------- 商品sku ------------------------------------------------------- */
/**
 *  初始化商品sku
 */
export function initGoodsSku(tagList, skuList, skuId) {
  let attrs = {}
  let skuInfo:any = {}
  let specList = []

  //  从商品中获取属性
  skuList.map(sku => {
    sku.skuId = sku.id
    sku.specList = sku.specSnap.split(',')
    if (sku.id === skuId) {
      skuInfo = sku
      specList = sku.specList
    }
  })

  // 商品 sku 标签 [ list => 商品属性, value => 选中属性key, options => 可选项 ]
  let tags = tagList.map((tag, key) => {
    const { value, ...data } = tag
    // const list = [...new Set(attrs[key])]
    const list = value.split(',')
    if (skuId) {
      data.value = list.indexOf(specList[key])
    }
    return { ...data, list, options: value.split(',') }
  })

  if (skuId) {
    const data = selectGoodsSku(specList, tags, skuList)
    tags = data.tagList
    skuInfo = data.goodsInfo
  }
  return { tags, attrs, skuInfo, skuList }
}

/**
 * 选择sku
 * @param checked 选中的属性
 * @param tagList 属性列表
 * @param skuList sku商品列表
 *
 * @return tagList 属性列表
 * @return goodsInfo sku商品信息
 */
export function selectGoodsSku(checked:Array<string>, tagList:Array<any>, skuList:Array<any>) {
  //  商品信息
  let goodsInfo = {}
  //  商品属性
  const tag = lodash.cloneDeep(tagList)
  //  所以商品属性
  let specList = []
  tag.map(tag => {
    tag.options = []
    specList = specList.concat(tag.list.filter(i => (checked.indexOf(i) ==-1)))
  })

  //
  skuList.map(sku => {
    const data = [...new Set([ ...sku.specList, ...specList ])]
    console.log(data.length)
    console.log(checked.length)
    console.log(specList.length)
    console.log('-------------------------------')
    if (data.length === (specList.length + checked.length)) {
      tag.map((spec, k) => {
        spec.options.push(sku.specList[k])
      })

      if (checked.length === sku.specList.length) {
        goodsInfo = sku
      }
    }

    if (data.length === (specList.length + checked.length - 1)) {
      tag.map((spec, k) => {
        if (spec.value !== undefined) {
          spec.options.push(sku.specList[k])
        }
      })
    }
  })

  //  可选项去重
  tag.map(tag => {
    tag.options = [...new Set(tag.options)]
  })

  return {
    tagList: tag,
    goodsInfo
  }
}
/* ------------------------------------------------------- 商品sku ------------------------------------------------------- */



/* ------------------------------------------------------- 订阅消息模板 ------------------------------------------------------- */
/**
 *  获取订阅消息模板
 */
export function getSubscribeMessage(key?:string) {
  // const app = Taro.getApp()
  // const data = app.globalData.subscribe || {}
  const data = getGlobalData('subscribe') || {}
  return (key ? data[key] : data)
}
/* ------------------------------------------------------- 订阅消息模板 ------------------------------------------------------- */



/* ------------------------------------------------------- 文件管理器 ------------------------------------------------------- */

/**
 *  删除文件/目录（包括目录下的所有文件）
 */
export function removeFile(filePath) {
  return new Promise((resolve, reject) => {
    try {
      const fileSystemManager = wx.getFileSystemManager()
      const file = fileSystemManager.statSync(filePath)
      if (file.isDirectory()) {
        const fileList = fileSystemManager.readdirSync(filePath)
        fileList.map(url => {
          removeFile(`${filePath}/${url}`).then()
        })
        fileSystemManager.rmdirSync(filePath)
      } else {
        fileSystemManager.unlinkSync(filePath)
      }
      resolve(filePath)
    } catch(err) {
      reject(err)
    }
  })
}

/* ------------------------------------------------------- 文件管理器 ------------------------------------------------------- */












/* ------------------------------------------------------- 显示 ------------------------------------------------------- */

/**
 * 显示会员价
 * @param salePrice 商品原价
 * @param memberPrice 会员价格
 */
export function showMemberPrice({ salePrice, memberPrice }) {
  return (memberPrice > 0 && salePrice !== memberPrice)
}

/* ------------------------------------------------------- 显示 ------------------------------------------------------- */





/**
 * 将 blob url 转化为文件
 * @param {string} url 要转换的 blob url
 * @returns {Promise<Blob>}
 */
export function convertObjectUrlToBlob (url) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest()
    xhr.open('GET', url, true)
    xhr.responseType = 'blob'
    xhr.onload = function (e) {
      if (this.status === 200) {
        resolve(this.response)
      } else {
        /* eslint-disable prefer-promise-reject-errors */
        reject({ status: this.status })
      }
    }
    xhr.send()
  })
}

/**
  * 方法将序列的所有元素随机排序。
  * @param arr 数组
  */
export function shuffle(arr:Array<any>) {
  let len = arr.length
  for (let i = 0; i < len - 1; i++) {
    const index = parseInt(`${Math.random() * (len - i)}`)
    const temp = arr[index]
    arr[index] = arr[len - 1 - i]
    arr[len - 1 - i] = temp
  }
  return arr
}


/**
 * 判断是否是微信端打开
 */
export function isWeChat() {
  const ua = window.navigator.userAgent.toLowerCase()
  // @ts-ignore
  return ua.match(/MicroMessenger/i) == 'micromessenger'
}




/**
 * 获取节点位置
 * @param dom
 */
export function getElementPosition(dom: any) {
  return {
    y: dom.offsetTop,
    x: dom.offsetLeft
  }
}

















/* ------------------------------------------------------- 显示 ------------------------------------------------------- */

let isBack = 0

export function setBackValue(value) {
  isBack = lodash.cloneDeep(value)
}

export function getBackValue() {
  return lodash.cloneDeep(isBack)
}

/* ------------------------------------------------------- 显示 ------------------------------------------------------- */









